package com.general.framework.zzyy.autoBoxing;

/**
 * 性能开销：频繁的装箱和拆箱操作可能导致性能问题，应尽量避免在高频率操作中使用包装类。
 * 空指针异常：在自动拆箱时，应检查包装类对象是否为null，以避免空指针异常。
 * 对象比较：在比较包装类对象时，应使用equals()方法进行值比较，而不是使用==进行引用比较。
 * 缓存机制：了解Integer缓存机制的影响，避免在范围内的整数对象比较中出现误判。
 * 混合运算：注意混合运算中的隐式转换，确保运算结果符合预期。
 */
public class PerformanceDemo {
    public static void main(String[] args) {
        Integer a = 1000;
        Integer b = 1000;
        // 1. == 运算符比较的是对象的引用，而不是对象的值，但是，由于 Integer 的缓存机制，在 -128 到 127 这个范围内，== 运算符会返回 true
        System.out.println(a == b); // 输出 false
        // 2. equals() 方法比较的是对象的值，而不是引用
        System.out.println(a.equals(b)); // 输出 true
        Integer c = 100;
        Integer d = 100;
        // 因为 Integer 的缓存范围是 -128 到 127，所以在这个范围内，== 运算符会返回 true
        System.out.println(c == d); // 输出 true

        // 3. 循环中频繁进行装箱和拆箱操作，会导致性能开销
        long startTime = System.nanoTime();
        Long sum2 = 0L;
        for (long i = 0; i < 1000000; i++) {
            sum2 += i; // 自动拆箱和装箱
        }
        long endTime = System.nanoTime();
        System.out.println("Time taken: " + (endTime - startTime));

        // 4. 可以通过使用基本数据类型来避免这种开销
        long start = System.nanoTime();
        long sum = 0L;
        for (int i = 0; i < 1000000; i++) {
            sum += i;
        }
        long end = System.nanoTime();
        System.out.println("Time taken: " + (end - start));
        // 5. 在自动拆箱时，如果包装类对象为null，会抛出NullPointerException。需要注意检查包装类对象是否为null。
        Integer eNum = null;
        try {
            int value = eNum; // 自动拆箱，会抛出 NullPointerException
        } catch (NullPointerException e) {
            System.out.println("Caught NullPointerException");
        }
    }
}
